package wodegua.d18_collection;

/**
 * 哈希值
 * ●就是一个int类型的数值，Java中每个对象都有一个哈希值。
 * ●Java中的所有对象，都可以调用0bejct类提供的hashCode方法，返回该对象自己的哈希值。
 * public int hashcode():返回对象的哈希码值。
 * 对象哈希值的特点
 * 同一个对象多次调用hashcode()方法返回的哈希值是相同的，
 * 不同的对象，它们的哈希值一般不相同，但也有可能会相同(哈希碰撞)。
 */

/**
 * Hashset集合的底层原理
 * ·基于哈希表实现。
 * 哈希表是一种增删改查数据，性能都较好的数据结构。
 * 哈希表
 * ●JDK8之前，哈希表=数组+链表
 * JDK8开始，哈希表=数组+链表+红黑树
 */

/**
 * JDK8之前Hashset集合的底层原理，基于哈表:数组+链表
 * 1创建一个默认长度16的数组，默认加载因子为0.75，数组名table
 * ②使用元素的哈希值对数组的长度求余计算出应存入的位置
 * ③判断当前位置是否为null，如果是null直接存入
 * ④ 如果不为null，表示有元素，则调用equals方法比较相等，则不存;不相等，则存入数组
 * 如果数组快占满了，会出什么问题?该咋办?链表会过长，导致查询性能降低
 * ●JDK8之前，新元素存入数组，占老元素位置，老元素挂下面
 * ●JDK 8开始之后，新元素直接挂在老元素下面
 */

/**
 * JDK8开始Hashset集合的底层原理，基于哈希表:数组+链表+红黑树
 * Segment[]
 * JDK8之前，哈希表=数组+链表
 * JDK8开始，哈表=数组+链表+红罵树
 * JDK8开始，当链表长度超过8，且数组长度>=64时，自动将链表转成红黑树
 * 小结:JDK8开始后，哈希表中引入了红黑树后，进一步提高了操作数据的性能。
 */

/**
 * 结论:如果希望Set集合认为2个内容一样的对象是重复的必须重写对象的hashcode()和equals()方法
 */

public class HashSetTest {
    public static void main(String[] args) {

    }
}
